home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / math / gle-3.000 / gle-3 / gle / dviwp.c < prev    next >
C/C++ Source or Header  |  1995-02-07  |  4KB  |  213 lines

  1. #define XSIZECM 24        /* at 120 DPI  */
  2. #define YSIZECM 24        /* at 72 DPI */
  3. #define NXBITS 200
  4. #define NYBITS 200
  5. #include "bitmap.h"
  6. extern char outbitname[];
  7. extern int fittobit;
  8. dvitype(void)
  9. {
  10.     fittobit = true;
  11.     printf("Adding TIFF, Include the EPF file into WordPerfect.");
  12.     strlwr(outbitname);
  13.     if (strlen(outbitname)==0) {
  14.         printf("You must give the name of the gle file.\n");
  15.         abort();
  16.     }
  17.     if (strstr(outbitname,".")!=0) {
  18.         * strchr(outbitname,'.') = 0;
  19.     }
  20.     strcat(outbitname,".epf");
  21. }
  22. /* tiff stuff starts here */
  23.  
  24. int32 sa(int32 a);
  25. int32 ss(char *s);
  26. int32 sw(int x);
  27. int32 sl(int32 x);
  28. int32 read_eps(char *fname,FILE *tf);
  29. int sendmem(char *s, int32 j);
  30. int setl(int32 p, int32 x);
  31. int setw(int32 p, int x);
  32.  
  33. int32 tcnt; /* current byte position */
  34. extern FILE *outbit;
  35. FILE *tf;
  36. extern int dev_nops;
  37. int addeps=true;
  38. int32 tstart;
  39. bitmap_print()
  40. {
  41.     /* 1=byte, 2=ascii, 3=short, 4=int32, 5=rational */
  42.     char fname[80];
  43.     int32 strip1,entrycount,stripoffsets,stripbcounts,ifd;
  44.     int32 datep,datelen,namep,namelen,i,j;
  45.     int32 h_ps,h_pslen,h_tiff,h_tifflen;
  46.  
  47.     if (dev_nops) addeps = false;
  48.     tf = outbit; /* output file handle */
  49.  
  50.     if (addeps) {
  51.         sw(0xd0c5); sw(0xc6d3);
  52.         h_ps = sl(0);
  53.         h_pslen = sl(0);
  54.         sl(0); sl(0);
  55.         h_tiff = sl(0);
  56.         h_tifflen = sl(0);
  57.         sw(0xffff);
  58.  
  59.         setl(h_ps,sa(tcnt));
  60.         i = tcnt;
  61.         tcnt += read_eps(outbitname,tf);
  62.         setl(h_pslen,tcnt-i);
  63.     }
  64.  
  65.  
  66.     tstart = sw(0x4949); /* byte order  4d 4d */
  67.     sw(0x002a);
  68.     ifd = sl(0x0000);
  69.     entrycount = sw(0);
  70.     setl(ifd,sa(entrycount));
  71.     sw(0xff); sw(3); sl(1); sw(1);  sw(0);        /* subfiletype */
  72.     sw(0x100); sw(3); sl(1); sl(nxbits);     /* image width */
  73.     sw(0x101); sw(3); sl(1); sl(nybits);          /* image length */
  74.     sw(0x102); sw(3); sl(1); sw(1); sw(0);  /* bits per sample */
  75.     sw(0x103); sw(3); sl(1); sw(1); sw(0);    /* no compression */
  76.     sw(0x106); sw(3); sl(1); sw(1); sw(0);  /* black and white */
  77.     sw(0x111); sw(4); sl(1); stripoffsets = sl(0); /* offsets to image data */
  78.     sw(0x11c); sw(3); sl(1); sw(1); sw(0); /* planar config */
  79.     sw(0x131); sw(2); namelen = sl(1); namep = sl(0); /* Name  */
  80.     sl(0); /* end of table  */
  81.     setw(entrycount,9);
  82.     strip1 = tcnt;
  83.     send_image();
  84.     setl(stripoffsets,sa(strip1));
  85.  
  86.     namelen = strlen("GLE Tiff output.");
  87.     setl(namep,sa(ss("GLE Tiff output.")));
  88.  
  89.     if (addeps) {
  90.         setl(h_tiff,tstart);
  91.         setl(h_tifflen,tcnt-tstart);
  92.     }
  93.  
  94.     fclose(tf);
  95.  
  96. }
  97. unsigned char swapbit[256];
  98. send_image()
  99. {
  100.     int y;
  101.     unsigned char swapnib[16]={0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
  102.     unsigned char *o,c;
  103.     int i,n1,n2;
  104.  
  105.     printf("Writing out TIFF image \n");
  106.     for (i=0;i<256;i++) {
  107.         n1 = i & 0xf;
  108.         n2 = (i >> 4) & 0xf;
  109.         swapbit[i] = swapnib[n2] | (swapnib[n1] << 4);
  110.     }
  111.  
  112.  
  113.     for (y=nybits-1 ; y>=0 ; y-=1)
  114.         print_row(y);
  115. }
  116. print_row(int y)
  117. {
  118.     unsigned char savechar,temp;
  119.     static unsigned char out_buff[NXBITS+10];
  120.     unsigned int r,i,j,newy,x,z;
  121.     unsigned char *line;
  122.     out_buff[0] = 0;
  123.     line = bitmap_line(y);
  124.     for (i=0; i<nxbits/8; i++) {
  125.         out_buff[i] = swapbit[line[i]];
  126.     }
  127.  
  128.     sendmem(out_buff,nxbits/8);
  129. }
  130.  
  131.  
  132. int32 sa(int32 a)
  133. {
  134.     return a-tstart;
  135. }
  136. int32 sw(int x)
  137. {
  138.     fwrite(&x,2,1,tf);
  139.     tcnt += 2;
  140.     return tcnt-2;
  141. }
  142. int32 ss(char *s)
  143. {
  144.     int i;
  145.  
  146.     i = strlen(s)+1;
  147.     if (i&1 == 1) i++;
  148.     fwrite(s,1,i,tf);
  149.     tcnt += i;
  150.     return tcnt-i;
  151. }
  152. sendmem(char *s, int32 j)
  153. {
  154.     fwrite(s,1,j,tf);
  155.     tcnt += j;
  156. }
  157. int32 sl(int32 x)
  158. {
  159.     fwrite(&x,4,1,tf);
  160.     tcnt += 4;
  161.     return tcnt-4;
  162. }
  163. setl(int32 p, int32 x)
  164. {
  165.     if (fseek(tf,p,SEEK_SET)!=0)  printf("Seekl failed, %ld %ld\n",p,tcnt);
  166.     fwrite(&x,4,1,tf);
  167.     if (fseek(tf,tcnt,SEEK_SET)!=0) printf("Seekl eof failed, %ld \n",p);
  168. }
  169. setw(int32 p, int x)
  170. {
  171.     if (fseek(tf,p,SEEK_SET)!=0) printf("Seekw failed, %ld  %ld\n",p,tcnt);
  172.     fwrite(&x,2,1,tf);
  173.     if (fseek(tf,tcnt,SEEK_SET)!=0) printf("Seekw eof failed, %ld \n",p);
  174. }
  175.  
  176. int32 read_eps(char *fname,FILE *tf)
  177. {
  178.     FILE *eps;
  179.     static char buff[1002];
  180.     char *s;
  181.     int32 tot=0;
  182.     int n;
  183.  
  184.     strcpy(buff,fname);
  185.     s = strchr(buff,'.');
  186.     if (s!=NULL) *s = 0;
  187.     strcat(buff,".eps");
  188.  
  189. #ifdef ultrix
  190.     eps = fopen(buff,"r");
  191. #else
  192.     eps = fopen(buff,"rb");
  193. #endif
  194.     if (eps==NULL) {
  195.         printf("Unable to open {%s}, you must PSGLE /EPS first\n",buff);\
  196.         abort();
  197.     }
  198.  
  199.     for (;!feof(eps);) {
  200.       n = fread(buff,1,1000,eps);
  201.       if (n>0) {
  202.         fwrite(buff,1,n,tf);
  203.         tot += n;
  204.       }
  205.     }
  206.     buff[0] = 13; buff[1] = 10; buff[2] = 0;
  207.     if (tot&1 == 1) {fwrite(" ",1,1,tf); tot++;}
  208.     fwrite(buff,1,2,tf); tot+=2;
  209.     return tot;
  210. }
  211.  
  212.  
  213.